/**
 * @BitmapMovie.as
 * 
 * @author sodaChen mail:asframe@qq.com
 * @version 1.0
 * <br>Copyright (C), 2012 ASFrame.com
 * <br>This program is protected by copyright laws.
 * <br>Program Name:ASFrame
 * <br>Date:2013-6-19
 */
package com.asframe.display.bmp
{
	import com.asframe.collections.maps.HashMap;
	import com.asframe.display.data.FrameData;
	import com.asframe.display.data.MovieData;
	import com.asframe.mgr.TimeMgr;
	
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	
	/**
	 * 利用Bitmap实现的动画.这里是纯粹的一帧帧播放。不做其他的任何处理。相当于播放器
	 * @author sodaChen
	 * #Date:2013-6-19
	 */
	public class CopyofBitmapMovie extends Bitmap
	{
		/** 附加的额外数据 **/
		public var extra				:*;
		/** 动画播放帧频(播放速度，单位是毫秒) **/
		public var frameRate			:int;
		/** 当前正在播放的标签名称（没有则标签则为空） **/
		public var currentLabel			:String;
		public var nextLabel			:String;
		/** 当前动画是否循环播放 **/
		public var isLoop				:Boolean;
		/** 是否正在播放 **/
		public var isPlaying			:Boolean;
		/** 播放结束的回调函数 **/
		public var playComplete			:Function;
		
		protected var mStart			:int;
		protected var mEnd				:int;
		
		protected var mLabelMap			:HashMap;
		/** 当前帧数 **/
		protected var mCurrentFrame		:int;
		/** 当前播放的动画数据数组（以帧标签为单位） **/
		protected var mFrameLabelData	:MovieData;
		////////////这两个属性一般是在FrameLabelData提取出，用于提升性能
		/** 当前播放动画的图像数组数据 **/
		protected var mBitmapDatas		:Vector.<BitmapData>;
		/** 当前播放动画的帧数组数据 **/
		protected var mFrames			:Vector.<FrameData>;
		
		public function CopyofBitmapMovie(pixelSnapping:String="auto", smoothing:Boolean=false)
		{
			super(null, pixelSnapping, smoothing);
			mLabelMap = new HashMap();
		}
		/**
		 * 获取动画的当前帧 
		 * @return 
		 * 
		 */		
		public function getCurrentFrame():int
		{
			return mCurrentFrame + 1;
		}
//		public function setBitmapDatas(bitmapDatas:Vector.<BitmapData>):void
//		{
//			this.mBitmapDatas = bitmapDatas;
//		}
		private function changeLabel(label:String):void
		{
			//这里有可能会出现问题，比如本身设置相同的label，目的是为了重置start的指数
			if(label == null || currentLabel == label)
				return ;
			
			this.currentLabel = label;
			
			this.mFrameLabelData = mLabelMap.get(label);
			this.mBitmapDatas = mFrameLabelData.bitmapDatas;
			this.mFrames = mFrameLabelData.frameDatas;
			this.mStart = 0;
			this.mCurrentFrame = 0;
			mEnd = mBitmapDatas.length;
		}
		public function addFrameLabel(mFrameLabelData:MovieData):void
		{
			//原来已经有了
			if(mLabelMap.hasKey(mFrameLabelData.label))
			{
				throw new Error("");
			}
			mLabelMap.put(mFrameLabelData.label,mFrameLabelData);
			if(this.mFrameLabelData == null)
			{
				//设置默认值
				changeLabel(mFrameLabelData.label);
			}
		}
		public function removeFrameLabel(label:String):MovieData
		{
			var delLabelData:MovieData = mLabelMap.remove(label);
//			if(delLabelData != null)
//			{
//				if(mFrameLabelData == delLabelData)
//				{
//					//重新设置默认数据
//				}
//			}
			return mFrameLabelData;
		}
		/**
		 * 播放Bitmap动画 
		 * @param isLoop 是否循环播放
		 * @param label 指定播放的内容
		 * @param callBack 结束帧数
		 * 
		 */		
		public function play(isLoop:Boolean = true,label:String = null,playComplete:Function = null):void
		{
			//从0开始算
			if(label != null)
			{
				changeLabel(label);
			}
			if(playComplete != null)
			{
				this.playComplete = playComplete;
			}
			this.isLoop = isLoop;
			
			//还没播放
			if(!isPlaying)
			{
				//添加到心跳列表中
				TimeMgr.addDelay(frameRate,update);
				isPlaying = true;
			}
		}
		public function stop():void
		{
			isPlaying = false;
			TimeMgr.removeDelay(update);
		}
		public function gotoAndPlay(start:int, end:int = -1,isLoop:Boolean = true,label:String = null,playComplete:Function = null):void
		{
			play(isLoop,label,playComplete);
			this.mStart = start;
			if(end != -1)
				this.mEnd = end;
		}
		public function gotoAndStop(stopFrame:int = -1,label:String = null):void
		{
			changeLabel(label);
			if(isPlaying)
			{
				TimeMgr.removeDelay(update);
				isPlaying = false;
			}
			//渲染当前帧
			if(stopFrame == -1)
				mCurrentFrame = mBitmapDatas.length - 1;
			else
				mCurrentFrame = stopFrame;
			
			bitmapData = mBitmapDatas[mCurrentFrame];
		}
		public function update():void
		{
			bitmapData = mBitmapDatas[mCurrentFrame];
			//更新位置
			if(mFrames != null)
			{
				x = mFrames[mCurrentFrame].x;
				y = mFrames[mCurrentFrame].y;
			}
			mCurrentFrame++;
			if(mCurrentFrame >= mEnd)
			{
				if(isLoop)
				{
					mCurrentFrame = mStart;
				}
				else
				{
					if(nextLabel != null)
					{
						//nextLabel标签一定是循环
						play(true,nextLabel);
					}
					else
					{
						//没有循环，则表示已经播放完了
						stop();
					}
				}
				//回调
				if(playComplete != null)
				{
					//这里这样设计的原因，是有可能playComplete回调的时候，还会再次调用play之类的方法进行重新设置playComplete
					var temp:Function = playComplete;
					playComplete = null;
					if(temp.length == 1)
						temp(this);
					else
						temp();
				}
			}
		}
	}
}
